Implement gdk_window_set_transient_for.
authorRichard Hult <richard@imendio.com>
Mon, 4 Jun 2007 20:02:58 +0000 (20:02 +0000)
committerRichard Hult <rhult@src.gnome.org>
Mon, 4 Jun 2007 20:02:58 +0000 (20:02 +0000)
2007-06-04  Richard Hult  <richard@imendio.com>

* gdk/quartz/gdkwindow-quartz.c:
* gdk/quartz/gdkwindow-quartz.h: Implement
gdk_window_set_transient_for.

svn path=/trunk/; revision=18036

ChangeLog
gdk/quartz/gdkwindow-quartz.c
gdk/quartz/gdkwindow-quartz.h

index 2e2055a7bf58fdfc605e77c057a31ac9b71d52cf..926e7ba19aa49004d4a4ff5e8b03091eefefa77d 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2007-06-04  Richard Hult  <richard@imendio.com>
+
+       * gdk/quartz/gdkwindow-quartz.c:
+       * gdk/quartz/gdkwindow-quartz.h: Implement 
+       gdk_window_set_transient_for.
+
 2007-06-04  Cody Russell  <bratsche@gnome.org>
 
        * gtk/gtklinkbutton.h
index 0188e0beb493440cfe9a8aef6872c19b55652520..702b063f195db49851044bc1b0984b4bcbf080da 100644 (file)
@@ -115,6 +115,9 @@ gdk_window_impl_quartz_finalize (GObject *object)
   if (impl->paint_clip_region)
     gdk_region_destroy (impl->paint_clip_region);
 
+  if (impl->transient_for)
+    g_object_unref (impl->transient_for);
+
   G_OBJECT_CLASS (parent_class)->finalize (object);
 }
 
@@ -815,6 +818,14 @@ show_window_internal (GdkWindow *window,
   if (private->state & GDK_WINDOW_STATE_ICONIFIED)
     gdk_window_iconify (window);
 
+  if (impl->transient_for && !GDK_WINDOW_DESTROYED (impl->transient_for))
+    {
+      GdkWindowImplQuartz *parent_impl;
+
+      parent_impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (impl->transient_for)->impl);
+      [parent_impl->toplevel addChildWindow:impl->toplevel ordered:NSWindowAbove];
+    }
+
   GDK_QUARTZ_RELEASE_POOL;
 }
 
@@ -856,6 +867,20 @@ gdk_window_hide (GdkWindow *window)
 
   if (impl->toplevel) 
     {
+      /* We must unset the transient while it is hidden, otherwise
+       * quartz won't hide the window.
+       */
+      if (impl->transient_for)
+        {
+          if (!GDK_WINDOW_DESTROYED (impl->transient_for))
+            {
+              GdkWindowImplQuartz *parent_impl;
+
+              parent_impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (impl->transient_for)->impl);
+              [parent_impl->toplevel removeChildWindow:impl->toplevel];
+            }
+        }
+
       [impl->toplevel orderOut:nil];
     }
   else if (impl->view)
@@ -1030,7 +1055,7 @@ gdk_window_set_background (GdkWindow      *window,
   g_return_if_fail (GDK_IS_WINDOW (window));
 
   if (GDK_WINDOW_DESTROYED (window))
-      return;
+    return;
 
   impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
 
@@ -1481,7 +1506,41 @@ void
 gdk_window_set_transient_for (GdkWindow *window, 
                              GdkWindow *parent)
 {
-  /* FIXME: Implement */
+  GdkWindowImplQuartz *window_impl;
+  GdkWindowImplQuartz *parent_impl;
+
+  if (GDK_WINDOW_DESTROYED (window) || GDK_WINDOW_DESTROYED (parent))
+    return;
+
+  window_impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (window)->impl);
+  if (!window_impl->toplevel)
+    return;
+
+  GDK_QUARTZ_ALLOC_POOL;
+
+  if (window_impl->transient_for)
+    {
+      if (!GDK_WINDOW_DESTROYED (window_impl->transient_for))
+        {
+          parent_impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (window_impl->transient_for)->impl);
+          [parent_impl->toplevel removeChildWindow:window_impl->toplevel];
+        }
+
+      g_object_unref (window_impl->transient_for);
+      window_impl->transient_for = NULL;
+    }
+
+  parent_impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (parent)->impl);
+  if (parent_impl->toplevel)
+    {
+      /* We save the parent because it needs to be unset/reset when
+       * hiding and showing the window. 
+       */
+      window_impl->transient_for = g_object_ref (parent);
+      [parent_impl->toplevel addChildWindow:window_impl->toplevel ordered:NSWindowAbove];
+    }
+  
+  GDK_QUARTZ_RELEASE_POOL;
 }
 
 void
index ccf85bef478dd381e46307f9d09ab52777f8a0d5..ce5e0ba520ac445eaac71526783d2f4a2ef2c9c7 100644 (file)
@@ -64,6 +64,8 @@ struct _GdkWindowImplQuartz
   GdkRegion *paint_clip_region;
   gint begin_paint_count;
   gint in_paint_rect_count;
+
+  GdkWindow *transient_for;
 };
  
 struct _GdkWindowImplQuartzClass